package com.fcg.redis.refresh.bean;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 调用指定对象的指定方法，刷新缓存
 *
 * @author FCG
 */
@Data
@Slf4j
public class CacheInvoker {

    private static List<CacheInvoker> invokers = new ArrayList<>();

    private Object targetObj;
    private Method targetMethod;

    public CacheInvoker(Object targetObj, Method targetMethod) {
        this.targetObj = targetObj;
        this.targetMethod = targetMethod;
    }

    public static void addInvoker(CacheInvoker cacheInvoker) {
        invokers.add(cacheInvoker);
    }

    public static void addInvokers(List<CacheInvoker> otherInvokers) {
        invokers.addAll(otherInvokers);
    }

    public void doInvoke() {
        Method method = getTargetMethod();
        Object target = getTargetObj();
        log.info("执行方法:{}", method.toString());
        ReflectionUtils.makeAccessible(method);
        ReflectionUtils.invokeMethod(method, target);
    }

    public static void doInvokes() {
        log.info("共{}个,初始化方法", invokers.size());
        invokers.forEach(CacheInvoker::doInvoke);
    }
}
